package cn.fansunion.leecode.computer.plus;

/**
 * 二进制求和 给你两个二进制字符串，返回它们的和（用二进制表示）。
 * 
 * 输入为 非空 字符串且只包含数字 1 和 0。 https://leetcode-cn.com/problems/add-binary/
 * 
 * 和PlusOne这道题，思路基本一样，PlusOne是一个变量+固定的数字1。
 *  https://leetcode-cn.com/problems/plus-one
 * 
 * @author wen.lei@brgroup.com
 *
 *         2022-2-18
 */
public class AddBinary {
    /*示例 1:
    
        输入: a = "11", b = "1"
        输出: "100"
        示例 2:
    
        输入: a = "1010", b = "1011"
        输出: "10101"
         
    
        提示：
    
        每个字符串仅由字符 '0' 或 '1' 组成。
        1 <= a.length, b.length <= 10^4
        字符串如果不是 "0" ，就都不含前导零。
    */
    /**
     * 获得2个字符串的最大长度，从低位到高位逐个相加。维护最新的进位。如果最终产生1个进位，需要额外添加
     * 
     * @param a
     * @param b
     * @return
     */
    public String addBinary(String a, String b) {
        final int lengthA = a.length();
        final int lengthB = b.length();
        int maxLength = Math.max(lengthA, lengthB);
        int plus = 0;
        StringBuilder sb = new StringBuilder();
        for (int index = 0; index < maxLength; index++) {
            int chAInt = 0;
            int chBInt = 0;
            if (index < lengthA) {
               char chA = a.charAt(lengthA - index - 1);
               //int类型转换，强制转换不行(Ascii)
               //final int chAInt = (int)chA;
               //final int chBInt = (int)chB;
               chAInt = Character.digit(chA, 2);
            }
            if (index < lengthB) {
                char chB = b.charAt(lengthB - index - 1);
                chBInt = Character.digit(chB, 2);
            }
            int sum = chAInt + chBInt + plus;
            sb.append(sum % 2);
            if (sum >= 2) {
                plus = 1;
            } else {
                plus = 0;
            }
        }
        //新产生1个最高位
        if (plus == 1) {
            sb.append(plus);
        }
        // 低位先维护的，展示时，高位在前
        return sb.reverse().toString();
    }
}
